const { EventEmitter } = require('events');

export const eventList = {
	sendTextMessage: 'send-text-message',
	sendResourceMessage: 'send-resource-message',
	updateUserInfo: 'update-user-info',
	updateMobileTitle: 'update-mobile-title',
	goBack: 'go-back',
	updateChatMessage: 'update-chat-message',
	hangUp: 'hang-up',
	preview: 'preview',
	uploadEnd: 'upload-end',
	chatViewMounted: 'chat-view-mounted',
	requestHangup: 'request-hangup',
	requestAudioCall: 'request-audio-call',
	requestVideoCall: 'request-video-call',
	updateWebTitle: 'update-web-title',
	emojiShowHide: 'emoji-show-hide',
	kbButtonClick: 'kb-button-click',
};

class ZcoIMEvent extends EventEmitter {
	/**
	 * 发送预览pdf或预览图片消息
	 * @param {*} data data:{type:png||pdf,url:String}
	 */
	emitPreview(data) {
		this.emit(eventList.preview, data);
	}

	/**
	 * 收到预览pdf或预览图片消息
	 * @param {*} ack
	 */
	onPreview(ack) {
		this.on(eventList.preview, ack);
	}

	/**
	 * 向应用层发起发送文本消息
	 * @param {object} data
	 */
	emitTextMessage(data) {
		this.emit(eventList.sendTextMessage, data);
	}

	/**
	 * 收到发送文本消息
	 * @param {Function} ack 收到回调消息
	 */
	onSendTextMessage(ack) {
		this.on(eventList.sendTextMessage, ack);
	}

	/**
	 * 发送资源文件
	 * @param {object} data
	 */
	emitResourceMessage(data) {
		this.emit(eventList.sendResourceMessage, data);
	}

	/**
	 * 收到发送资源文件事件
	 * @param {Function} ack
	 */
	onSendResourceMessage(ack) {
		this.on(eventList.sendResourceMessage, ack);
	}

	/**
	 * 发送更新用户信息
	 * @param {object} userInfo
	 */
	updateUserInfo(userInfo) {
		this.emit(eventList.updateUserInfo, userInfo);
	}

	/**
	 * 收到更新用户信息
	 * @param {Function} ack
	 */
	onUpdateUserInfo(ack) {
		this.on(eventList.updateUserInfo, ack);
	}

	/**
	 *  更新手机端标题的变化
	 *  @param {object} {title, type}  title : 标题文本, type： im | audio | video, members ： 在线人数
	 */
	updateMobileTitle(data) {
		this.emit(eventList.updateMobileTitle, data);
	}
	/**
	 *  监听手机端标题的变化
	 * @param {Function} ack
	 */
	onUpdatMobileTitle(ack) {
		this.on(eventList.updateMobileTitle, ack);
	}

	/**
	 *  关闭im 聊天 对话框回到通话中
	 * @param {Boolean} colse
	 */
	updateColesImChatMessage(colse) {
		this.emit(eventList.goBack, colse);
	}
	/**
	 *
	 * @param {Function} ack
	 */
	onUpdateColesImChatMessage(ack) {
		this.on(eventList.goBack, ack);
	}

	/**
	 * 更新聊天记录
	 * @param {Array} data 聊天记录
	 */
	updateChatMessage(data) {
		this.emit(eventList.updateChatMessage, data);
	}

	/**
	 * 收到更新聊天记录
	 * @param {Function} ack
	 */
	onUpdateChatMessage(ack) {
		this.on(eventList.updateChatMessage, ack);
	}

	/**
	 * 结束会话
	 */
	hangUp(data) {
		this.emit(eventList.hangUp, data);
	}

	/**
	 * 收到结束会话
	 */
	onHangUp(ack) {
		this.on(eventList.hangUp, ack);
	}

	/**
	 * 发送上传结束事件
	 * @param {object} data
	 */
	emitUploadEnd(data = undefined) {
		this.emit(eventList.uploadEnd, data);
	}

	/**
	 * 收到上传结束事件
	 * @param {Function} ack
	 */
	onUploadEnd(ack) {
		this.on(eventList.uploadEnd, ack);
	}

	/**
	 * 发送聊天窗口加载完成事件
	 */
	emitChatViewMounted() {
		this.emit(eventList.chatViewMounted);
	}

	/**
	 * 收到聊天窗口加载完成事件
	 * @param {Function} ack
	 */
	onChatViewMounted(ack) {
		this.on(eventList.chatViewMounted, ack);
	}

	/**
	 *  im模式中点击了挂断按钮
	 */
	requestHangup() {
		this.emit(eventList.requestHangup);
	}

	/**
	 * 收到点击了挂断按钮事件
	 * @param {Function} ack
	 */
	onRequestHangup(ack) {
		this.on(eventList.requestHangup, ack);
	}

	/**
	 *  im模式中点击了语音通话按钮
	 */
	requestAudioCall() {
		this.emit(eventList.requestAudioCall);
	}

	/**
	 *  im模式中点击了视频通话按钮
	 */
	requestVideoCall() {
		this.emit(eventList.requestVideoCall);
	}

	/**
	 * 收到点击了语音通话事件
	 * @param {Function} ack
	 */
	onRequestAudioCall(ack) {
		this.on(eventList.requestAudioCall, ack);
	}

	/**
	 * 收到点击了视频通话事件
	 * @param {Function} ack
	 */
	onRequestVideoCall(ack) {
		this.on(eventList.requestVideoCall, ack);
	}

	/**
	 *  更新web聊天窗口标题
	 *  @param {object} {title, type}  title : 标题文本, type： im | audio | video, members ： 在线人数
	 */
	updateWebTitle(data) {
		this.emit(eventList.updateWebTitle, data);
	}
	/**
	 *  监听更新呼叫类型变化
	 * @param {Function} ack
	 */
	onUpdateWebTitle(ack) {
		this.on(eventList.updateWebTitle, ack);
	}

	/**
	 * 发送emoji表情显示隐藏事件
	 * @param {object} data
	 */
	emitEmojiShowHide(data) {
		this.emit('emoji-show-hide', data);
	}

	/**
	 * 发送emoji表情显示隐藏事件
	 * @param {object} data
	 */
	onEmojiShowHide(ack) {
		this.on('emoji-show-hide', ack);
	}

	/**
	 * 发送知识库按钮点击事件
	 * @param {*} data 
	 */
	emitKbButtonClick(data) {
		this.emit(eventList.kbButtonClick, data);
	}

	/**
	 * 收到知识库按钮点击事件
	 * @param {*} ack 
	 */
	onKbButtonClick(ack) {
		this.on(eventList.kbButtonClick, ack);
	}
}

const zcoIMEvent = new ZcoIMEvent();
export default zcoIMEvent;
